

function websocket(){
  const { WebSocketServer } = require("ws"); //  引入WebSocketServer模块
  const Websocket = require("ws");
  const WebSocket = require("ws"); //  引入WebSocket模块

  const onLineList = []; //  定义一个在线用户列表

// 我们的port是8090
  const wss = new WebSocket.Server({ port: 8080 });

// 如果有ws就代表初始化成功
  if (wss) {
    console.log("ws初始化成功");
  }

  wss.on("connection", function connection(ws, request) {
    const user = new URL(request.url, `http://${request.headers.host}`).searchParams.get('user');
    console.log(`${user} 已连接`)
    let welCome = JSON.stringify({
      type: "tips",
      content: "欢迎加入聊天室，现在我们开始畅聊吧"
    });

    ws.send(welCome, { binary: false });

    ws.on("error", (error) => {
      console.log("WebSocket error:", error);
    });

    //   注册收到消息的事件
    ws.on("message", async function message(data) {
      const message = JSON.parse(data); //  将收到的数据解析为JSON格式
      switch (
        message.type //  根据消息类型进行不同的处理
        ) {
        case "init":
          if (message.userId) {
            //  如果消息中包含用户id
            // 为当前的用户  ws链接绑定 用户id，用于用户断开连接时，改变用户状态
            ws.userId = message.userId;
            // 上线
            keepLatestOnlineList("onLine", message);
          }
          break;
        case "message":
          wss.clients.forEach(client => {
            //  遍历所有客户端
            if (!message.timestamp) {
              message.timestamp = new Date().toISOString();
            }
            if (client.readyState === Websocket.OPEN) {
              //  如果客户端处于打开状态
              client.send(JSON.stringify(message), { binary: false }); //  发送消息
            }
          });
          break;
        default:
          break;
      }
    });
    //   被动断开说明用户已经离开网站了 维护在线列表
    ws.on("close", function() {
      keepLatestOnlineList("close", { userId: ws.userId });
    });
  });

  function keepLatestOnlineList(type, message) {
    let index = onLineList.findIndex(item => item.userId === message.userId); //  在在线列表中查找用户
    switch (type) {
      case "onLine":
        if (index === -1) {
          //  如果用户不在在线列表中，则添加用户
          onLineList.push({ userId: message.userId });
        }
        break;
      case "close":
        if (index !== -1) {
          //  如果用户在在线列表中，则删除用户
          onLineList.splice(index, 1);
          console.log("有客户被断开");
        }
        break;
      default:
        break;
    }
  }

}
module.exports = websocket
